package controlador;

import vista.InterfazGraficaCompra;
import vista.Mensaje;
import vista.VentanaIndependiente;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.event.ActionListener;
import java.util.Calendar;
import java.util.Iterator;
import java.util.List;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;

import modelo.Buscador;
import modelo.CompraDao;
import modelo.CompraDetalle;
import modelo.Compras;
import modelo.Ingrediente;
import modelo.IngredienteDao;
import modelo.ProveedorDao;

public class ControladorCompra implements WindowListener,ActionListener,KeyListener,Buscador
{
	private InterfazGraficaCompra interfazGrafica;
	private ControladorPrincipal controladorPrincipal;
	private TableModel modeloTabla;
	private IngredienteDao ingredienteDao;
	
	public ControladorCompra(ControladorPrincipal controladorPrincipal)
	{
		this.controladorPrincipal= controladorPrincipal;
		
		interfazGrafica= new InterfazGraficaCompra();
		
		ingredienteDao= new IngredienteDao();
		
		interfazGrafica.addListener((WindowListener) this);
		interfazGrafica.addListener((ActionListener) this);
		interfazGrafica.visualizarVentana();
	}
	
	private void registrarCompra()
	{
	  try
	  {	
		  Compras compra= new Compras();
		  CompraDao compraDao= new CompraDao();
		  
		  compra.setNroCompra(interfazGrafica.getNroFactura());
		  compra.setFecha(Calendar.getInstance());
		  compra.setProveedor(new ProveedorDao().getProveedor(interfazGrafica.getProveedor()));
		  compra.setPorcImpuesto(interfazGrafica.getPorcImpuesto());
		  
		  
		  boolean valido= true;
		  
		  if (modeloTabla instanceof ModeloTablaModificable)
		  {
			  try
			  {
				  for (int i=0; i < modeloTabla.getRowCount(); ++i)
				  {
					  Ingrediente ingrediente = null;
					  CompraDetalle compraD=null;
					  if ((Boolean) modeloTabla.getValueAt(i, 0))
					  {	
							  
							double costoU= Double.parseDouble(modeloTabla.getValueAt(i, 5).toString());
							double cantidad= Double.parseDouble(modeloTabla.getValueAt(i, 6).toString());
							String codigo= modeloTabla.getValueAt(i, 1).toString();
					        
							ingrediente = new IngredienteDao().getIngrediente(codigo);
							
							ingrediente.setCosto(costoU);
							
							compraD= new CompraDetalle(ingrediente,cantidad);
							compra.agregarCompraDetalle(compraD);
					  }   
			         
				  }
			  }
			  catch(Exception e)
			  {
				 valido=false; 
			  }	  
		  }
		  
		  if (compra.validar() && valido)
		  {
			  if (Mensaje.mostrarConfirmacion("Desea Registrar esta Compra?"))
			  {
				  if (compraDao.registrarCompra(compra))
				  {
					  Mensaje.mostrarInformacion("La Compra se ha realizado con Exito");
				  }
				  else
				  {
					 Mensaje.mostrarError("Error Registrando Compra");
					 
				  }	
				  iniciar();
					 
			  }	  
		  }
		  else
		  {
			  Mensaje.mostrarError("La Compra no Puede ser Procesada");
			  iniciar();
		  }
	  }
	  catch(Exception e)
	  {
		  Mensaje.mostrarError("Error Registrando la Compra");
		  try
		  {
			  iniciar();
		  }
		  catch(Exception excep){}
	  }
	}
	
	
	@Override
	public void actionPerformed(ActionEvent evt) 
	{   
			
		if (evt.getActionCommand().equalsIgnoreCase("BuscarProveedor"))
		{
			new ControladorBuscarProveedor(this);
		}
		else if (evt.getActionCommand().equalsIgnoreCase("ACEPTAR"))
		{
			registrarCompra();
		}
		else if (evt.getActionCommand().equalsIgnoreCase("CANCELAR"))
		{
			iniciar();
		}
	    else if (evt.getActionCommand().equalsIgnoreCase("SALIR"))
		{
			controladorPrincipal.visualizarVentanaPrincipal();
			interfazGrafica.descargarMemoria();
		}	
		
	}

	@Override
	public void windowActivated(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void windowClosed(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void windowClosing(WindowEvent arg0) 
	{
		interfazGrafica.descargarMemoria();
		controladorPrincipal.visualizarVentanaPrincipal();
		
	}

	@Override
	public void windowDeactivated(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void windowDeiconified(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void windowIconified(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void windowOpened(WindowEvent arg0) {
		iniciar();
		
	}

	@Override
	public VentanaIndependiente getVentana() {
		return interfazGrafica.getVentana();
	}

	@Override
	public void asignarElementoBuscado(String elemento) 
	{
	      interfazGrafica.asignarProveedor(elemento);
		
	}

	@Override
	public void keyPressed(KeyEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void keyReleased(KeyEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void keyTyped(KeyEvent evt) {
		if (evt.getSource() instanceof javax.swing.JTextField)
		{	
			if (!(Character.isDigit(evt.getKeyChar()) || '.'==evt.getKeyChar()))		
	            evt.setKeyChar(Character.MIN_VALUE);
			
			
				actualizarTotal();
			
                
		}
		
	}
	
	private class ModeloTablaModificable extends AbstractTableModel
	{
		 
		   private  Object[][] info;
		   private  Object[] titulo;

		   ModeloTablaModificable(Object[][] data,Object[] titulos)
		   {
		         info= data;
		         titulo= titulos;
		         
		   }     
		   
		   public ModeloTablaModificable(Object[] columnNames, int rowCount) {
		        titulo= columnNames;
		        info= new Object[rowCount][columnNames.length];
		    }

		    public int getRowCount() {
		        return info.length;
		    }

		    public int getColumnCount() {
		       return titulo.length;
		    }

		    public Object getValueAt(int rowIndex, int columnIndex) {
		        return info[rowIndex][columnIndex];
		    }

		    public Class<? extends Object> getColumnClass(int c) {
		            return info[0][c].getClass();
		        }

		    public String getColumnName(int col) {
		            return titulo[col].toString();
		        }


		    public boolean isCellEditable(int row,int col)
		    {
		        boolean editable= false;
		        if (col==0 || col==5 || col==6)
		            editable= true;
		        return editable;
		    }

		    public void setValueAt(Object value, int row, int col)
		    {
		    	
		    	info[row][col]= value; 	
		    	 if (col==5 || col==6)
		    	 {
		    		
		    		actualizarTotal();
		    		
		    	 } 
		    	    	 
		        fireTableCellUpdated(row, col);
		    }
		
	}
	
	private void iniciar()
	{
		Object[] encabezado= {"","Codigo","Nombre Corto","Nombre Largo","Unid Medida","Costo","Cantidad"};
		modeloTabla= new ModeloTablaModificable(encabezado,0);
		interfazGrafica.asignarDatosTabla(modeloTabla);
		
		interfazGrafica.setFecha(String.format("%1$td/%1$tm/%1$tY",java.util.Calendar.getInstance()));
		
		
		interfazGrafica.setPorcImpuesto(0.0f);
		interfazGrafica.asignarProveedor("");
		interfazGrafica.setTotal(0.0);
		try
		{
			interfazGrafica.setNroFactura(new CompraDao().getNroCompras() + 1);
			List<Ingrediente> listaIngredientes= ingredienteDao.consultarIngredientesActivos();
			
			Object[][] data= new Object[listaIngredientes.size()][encabezado.length];
			
			Iterator<Ingrediente> iterador= listaIngredientes.iterator();
	
	        Ingrediente ingrediente;
	        
	        int i=0;
	        
	        while (iterador.hasNext())
	        {	
	        	ingrediente= iterador.next();
	        	data[i][0]= new Boolean(false);
	            data[i][1]= ingrediente.getCodigo();
	            data[i][2]= ingrediente.getNombreCorto();
	            data[i][3]= ingrediente.getNombreLargo();
	            data[i][4]= ingrediente.getUnidadMedida();
	            data[i][5]= ingrediente.getCosto();
	            data[i][6]= 0.0;
	            ++i;
	        }
			
			
			
			modeloTabla= new ModeloTablaModificable(data,encabezado);
		    
			 
	      	TableColumn marcaVerificacion= interfazGrafica.getTableColumnModel().getColumn(0);
	     
			marcaVerificacion.setPreferredWidth(5);
		}
		catch (Exception e)
		{
			Mensaje.mostrarError("Error Cargando Ingredientes");
		}
		finally
		{
			interfazGrafica.asignarDatosTabla(modeloTabla);
		}
	}
	
	private void actualizarTotal()
	{
       try
       {			
			if (modeloTabla instanceof ModeloTablaModificable)
			 {
				double total=0.0;
				for (int i=0; i < modeloTabla.getRowCount(); ++i)
				{
					if ((Boolean) modeloTabla.getValueAt(i, 0))
					{	
						  
						double costoU= Double.parseDouble(modeloTabla.getValueAt(i, 5).toString());
						double cantidad= Double.parseDouble(modeloTabla.getValueAt(i, 6).toString());
						
				        total += costoU * cantidad;
					}   
			        
				}
				
		        double porcImpuesto= interfazGrafica.getPorcImpuesto();
		      
		        
		        interfazGrafica.setTotal(Math.floor(total + (total * porcImpuesto)/100));
			 }
       }
       catch(Exception e){}
         
	}
	

}
